{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.3 交互特征与多项式特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "import mglearn\n",
    "import numpy as np\n",
    "X,y = mglearn.datasets.make_wave(n_samples=100)\n",
    "line = np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)\n",
    "bins = np.linspace(-3,3,11)\n",
    "which_bin = np.digitize(X,bins)\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "encoder = OneHotEncoder(sparse=False)\n",
    "encoder.fit(which_bin)\n",
    "X_binned = encoder.transform(which_bin)\n",
    "print(X_binned[:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100, 11)\n"
     ]
    }
   ],
   "source": [
    "X_combined = np.hstack([X,X_binned])\n",
    "print(X_combined.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x170bf71df40>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "line_binned = encoder.transform(np.digitize(line,bins=bins))\n",
    "reg = LinearRegression().fit(X_combined,y)\n",
    "line_combined = np.hstack([line,line_binned])\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(line,reg.predict(line_combined),label='linear regression combined')\n",
    "for bin in bins:\n",
    "    plt.plot([bin,bin],[-3,3],':',c='k')\n",
    "plt.legend(loc='best')\n",
    "plt.ylabel('Regression output')\n",
    "plt.ylabel(\"Input feature\")\n",
    "plt.plot(X[:,0],y,'o',c='k')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100, 20)\n"
     ]
    }
   ],
   "source": [
    "X_product = np.hstack([X_binned,X*X_binned])\n",
    "print(X_product.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x170bd79a250>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEGCAYAAABsLkJ6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO2deXgUVdbG35M9gYAQdkk6oIhihn2VXRHQERVF0YniShT1Gx23AFFUlFEUEZcBDaOgJiM4Co4EREQWZRMCsm+CZGMJCTEhIQtZzvdHd2In6equrq6lu+v+nuc+SVfXrfee6u576m7nEjNDIBAIBOYjwOgCCAQCgcAYhAMQCAQCkyIcgEAgEJgU4QAEAoHApAgHIBAIBCYlyOgCuEOrVq04NjbW6GIIBAKBT7Fz5858Zm7d8LhPOYDY2Fikp6cbXQyBQCDwKYgo09Fx0QUkEAgEJkU4AIFAIDApwgEIBAKBSfGpMQCBwNuprKxETk4OysvLjS6KwISEhYWhY8eOCA4OlnW+cAACgYrk5OQgMjISsbGxICKjiyMwEcyMc+fOIScnB506dZKVx7AuICIKI6LtRLSHiA4Q0StGlUUgUIvy8nJERUWJyl+gO0SEqKgot1qfRrYAKgBcy8wlRBQMYBMRfcfM2wwsk0DgMaLyFxiFu989wxwAW+NQl9heBtuSiE0tEAgEOmHoLCAiCiSi3QDOAviBmX9xcE4CEaUTUXpeXp7+hRQIfIymTZsCAE6dOoUJEyYYXBrj+fDDD/HZZ58ZXYxGvPzyy5gzZ46ivPPmzUNpaanHZTDUATBzNTP3BNARQH8iinNwTjIz92Xmvq1bN1rJLIsdO3Zgx44dHpZWGUZpm03XSG0jbb5w4QIuXLjg8L0OHTrgq6++0lS3qqpK8hxn78mBmVFTUyOpLZdHH30UkyZN8qgs7uhWV1d7rOVK2y8cQC3MXAhgA4CxWlz/ueeew3PPPafFpb1W22y6RmobaXNOTg5ycnIcvpeRkYG4OOsz1eLFi3Hbbbdh7Nix6NKlC55//vm689asWYNBgwahd+/euOOOO1BSYu2ZnTlzJvr164e4uDgkJCSgdvfAESNG4Omnn8aIESPw7rvv1tN8+eWXkZCQgNGjR2PSpEnIy8vD7bffjn79+qFfv37YvHkzACAvLw/XX389evfujUceeQQWiwX5+fnIyMjAVVddhcceewy9e/dGdnY23nrrLfTr1w/du3fHSy+9hJycHBw9ehR//etf0aNHD8TFxWHp0qUAgKlTp6Jbt27o3r07nn322boy1T5p7969GwMHDkT37t0xfvx4/PHHH3U2JSYmon///rjiiivw888/N7qfX3/9NUaMGIHx48ejW7duePTRR+scVNOmTTFjxgwMGDAAW7duxdy5cxEXF4e4uDjMmzev7hqzZs1C165dMWrUKBw5cqTu+IgRI+rC3OTn56M25ll1dTWeffZZ9OrVC71798b777+P9957D6dOncLIkSMxcuRI518QFxg2BkBErQFUMnMhEYUDGAVgthZaH3zwgRaX9Wpts+kaqS2l+8qKAzh46ryqWt06NMNL466uex0TEyM77+7du/Hrr78iNDQUXbt2xf/93/8hPDwcr732GtauXYsmTZpg9uzZmDt3LmbMmIEnnngCM2bMAADce++9SEtLw7hx4wBYn85/+uknhIeHN9LZuXMnNm3ahPDwcPztb3/DP/7xDwwZMgRZWVkYM2YMDh06hFdeeQXXXnstpk2bhtWrVyM5Obku/5EjR7Bo0SLMnz8fa9aswW+//Ybt27eDmXHzzTdjyJAhyM/PR4cOHbBy5UoAQFFREQoKCrB8+XIcPnwYRITCwsJGZZs0aRLef/99DB8+HDNmzMArr7xSV0FXVVVh+/btWLVqFV555RWsXbu2Xt62bdti3759WLp0KSwWC8aOHYtly5ZhwoQJuHDhAuLi4jBz5kzs3LkTixYtwi+//AJmxoABAzB8+HDU1NRgyZIl+PXXX1FVVYXevXujT58+Tj+z5ORknDhxAjt37kRQUBDKysrQsmVLzJ07F+vXr0erVq1kf/6OMHIWUHsAnxJRIKwtkS+ZOU0LodqnICMwSttsukZqG2mzowpYiuuuuw7NmzcHAHTr1g2ZmZkoLCzEwYMHMXjwYADAxYsXMWjQIADA+vXr8eabb6K0tBQFBQW4+uqr6xxAfHy8pPbNN99c997atWtx8ODBuvfOnz+P4uJibNq0CcuXLwcAjB07Fi1atKg7x2KxYODAgQCsrZM1a9agV69eAICSkhJkZWVh6NChmD59OhITE3HTTTdh6NChqKqqQlhYGB5++GH89a9/xU033VSvXEVFRSgsLMTw4cMBAPfddx/uuOOOuvdvu+02AECfPn2QkZHRyK7Q0FD0798fnTt3BgDcfffd2LRpEyZMmIDAwEDcfvvtAIBNmzZh/PjxaNKkSd11f/75Z9TU1GD8+PGIiIiou0+uWLt2LR599FFERkYCcO/zloORs4D2Auilh9aWLVsAANdcc40ecl6hbTZdI7WldO2f1LWitrumduDXGaGhoXX/BwYGoqqqCsyM66+/Hl988UW9c8vLy/HYY48hPT0d0dHRePnll+vNLycilJSUONStrfgAoKamBlu3bm1UcdV2JznCPj8zY9q0aXjkkUfqjtXavHPnTqxatQrTpk3D6NGjMWPGDGzfvh0//vgjlixZgg8++ADr1q1zdVvqqL0/tfemIWVlZY3GJGqnXYaFhSEwMNClbVLTNIOCguqubX+fmbnuXgPyPmd38IoxAK2ZPn06pk+fbipts+kaqW2kzSdPnsTJkycV5x84cCA2b96MY8eOAQBKS0tx9OjRukqoVatWKCkpaTSYfPbsWVm6o0ePrtdFtnv3bgDAkCFD8OWXXwKwPuXX9sU3ZMyYMfjkk0/qKsCTJ09i79692LVrFyIiInDPPffg2Wefxa5du1BSUoKioiLceOONmDdvXp1WLc2bN0eLFi3q+vc///zzutaAHPLy8pCeno4TJ06gpqYGS5cuxZAhQxqdN2zYMHzzzTcoLS3FhQsXsHz5cgwdOhTDhg3D8uXLUVZWhuLiYqxYsaIuT2xsLHbu3AkA9e716NGj8eGHHyIzMxMnT55EQUEBACAyMhLFxcWyyy6FKUJBfPTRR6bTNpuukdpG2myxWDzK37p1ayxevBh33303KioqAACvvfYarrjiCkyePBl/+ctfEBsbi379+tXL1759e1na7733Hh5//HF0794dVVVVGDZsGD788EO89NJLuPvuu7F06VIMHz4c7du3R2RkZF1FX8vo0aNx6NChum6ppk2b4uOPP8bx48fRv39/BAQEIDg4GAsWLEBxcTFuueUWlJeXg5nxzjvvNCrPp59+ikcffRSlpaXo3LkzFi1aJPtetWvXDgMHDsTUqVOxb98+DBs2DOPHj290Xu/evXH//fejf//+AICHH364rgtr4sSJ6NmzJywWC4YOHVqX59lnn8Wdd96Jzz//HNdee23d8YcffhhHjx7FhAkTEBwcjISEBDzxxBNISEjADTfcgPbt22P9+vWybWgIOWuueBt9+/ZlsSGMwJs5dOgQrrrqKqOL4fVUVFQgMDAQQUFB2Lp1K6ZMmdLoid3b2LBhA+bMmYO0NE2GKlXD0XeQiHYyc9+G55qiBbBx40YAcKu55+vaZtM1UttIm2u7AWoHCX1FNysrC3feeSdqamoQEhKChQsX6qatlNLSUo/XNihFK5tN0QIYMWIEAKsH1xujtM2ma6S2va7eLYDaueRdu3bVTdNIXSO1fcVm0QJowCeffGI6bbPpGqndULd25oYe1C4Y0hujdI3U9gWb3X2gN0ULQCDQixMnTiAyMlKEhBboTu1+AMXFxY32AzB1C6B2Rd+oUaNMo202XSO17XU7duyInJwc6BW4sHa6ZlhYmC56Rusaqe0LNtfuCCYXU7QAzN4vbQZdI7WFzfoibHYfqRaAKRxAdnY2ACA6OlrtInmtttl0jdQWNuuLsNl9TO0ABAKBwMxIOQBThIJYvXo1Vq9ebSpts+kaqS1sNoe2P9psihaAL/fdCV3v1xY264uw2X1M3QV05swZANZYHnpjlLbZdI3UFjbri1raqampSEpKQlZWFmJiYjBr1izEx8drrqsET7VN7QAEAoHAntTUVCQkJNTbVjEiIgLJyclOnYCvYuoxgBUrVtQLvWoGbbPpGqktbPY97aSkpEZ76paWliIpKUlTXaVopW2KFoAv990JXe/XFjbrixraAQEBDsMmEJHDjejV0lWKGAOAcgeQn58PAB7vn6kEo7TNpmuktrBZX9TQjo2NRWZmZqPjFovF4XaQaukqxVNtUzsAgUAgsEeMAVgxxRjAsmXLsGzZMlNpm03XSG1hs+9px8fHIzk5GRaLBUQEi8XisvL3dZsdYYoWgC/33Qld79cWNuuLsNl9TN0FVFRUBMC6KbTeGKVtNl0jtYXN+iJsdh9TOwCBQCAwM6YeA1i6dCmWLl1qKm2z6RqpLWw2h7Y/2mxYC4CIogF8BqAdgBoAycz8rrM8YgxA6HqjtrBZX4TN7uN1XUBE1B5Ae2beRUSRAHYCuJWZD0rlUeoAaqd6RUREKCytcozSNpuukdrCZn0RNruP120JycynAZy2/V9MRIcAXApA0gEoxYgPzGhts+kaqS1sNoe2P9rsFWMARBQLoBeAXxy8l0BE6USUrnSf1ZSUFKSkpHhURqUYpW02XSO1hc3m0PZHmw2fBURETQFsBDCLmZ2udBBjAELXG7WFzfriTNvdEM9q6WqN340BAAARBQNIA/A9M891db5SB1BZWQkACA4OdjuvpxilbTZdI7WFzfoipa11eAdvtFkuXucAiIgAfAqggJmfkpNHrAMQCARSKAnwZha8cR3AYAD3AriWiHbb0o1aCC1evBiLFy/W4tJeq202XSO1hc3eoZ2VleXwfKnjaunqgVbaho8BuIMYAxC63qgtbNYXKW2tWwDeaLNcvK4LSAmiC0ggEEhhthDP7uCNXUACgUCgGkpCPEuRmpqK2NhYBAQEIDY2FqmpqRqU2HhM0QJYuHAhAGDy5MlqF8lrtc2ma6S2sFlftNaWakncfffdGDBggE/abOouoFGjRgEA1q5dq3aRvFbbbLpGagub9UVrbamxhLCwMAwePNgnbTa1AxAIBAK5KNkw3tsRYwACgcDv0KKvPiYmxq3jvowpHMD8+fMxf/58U2mbTddIbWGzMdq1ffWZmZlgZmRmZiIhIcFjJzBr1qxGwdciIiIwYsQIw21WG1M4gBUrVmDFihWm0jabrpHaRtv80Ucf6T5jxWibV6xYgaSkpHoDtYA1bHJSUpJH15eaTZSbm2u4zWojxgAEAh/GbHPfq6pr8OTS3aiorMbHDwwA/KyvXivEGIBA4Ido9RTsrRRcuIiVe09jT04Rgpu1dnhOYLPWuPbtDfjbwm14euluzF59GJ9uycD3B85gT3Yhcs+Xo7rGex989VyDYIoWwLvvWneafPLJJ9Uuktdqm03XSG0jbbbGVHR8XMunYKNsPl1UhqtvfxLjunfA6D5dGrV+QkLDcNPjr6Bd71E4XVSG3PMVyD1fjqoGFX5gAKFNZCjaNgtDu2ZhaNc8DG2bhaG97W+75tbj4SGBdXn0sFmqRXfbbbehb9++irVNPQ305ptvBgB8++23ahfJa7XNpmuktpE2R0REoKysrNFxrSNgGmXz+8mL8OTjj4KrLsJiseDGG2/EqlWrnMb/r6lhnLtwEbnny3G6qBxnzpcj1/b3jN3r4oqqRnrNwoLQvnk42jYPw5b5zyMmKgIPTYrXbM8BqTUI4eHhGDVqlOL7bWoHIBD4K2YaA0hNTcXkyZMbObyoqCi8++67Htt7oaLqT6dQ6xjsnMS+k0XoV3UQK+e/rNn91moNgpQDADP7TOrTpw8LBIL6pKSksMViYSJii8XCKSkpRhdJEywWCwNwmCIiIjS3u/vL33Pz1u0d6lssFlU0pGz09PoA0tlBnWqKQeA5c+Zgzpw5ptI2m66R2kbbfPr0aWRkZKCmpgYZGRm6PPkbYbOzuP56DHwXbPsaRXmnHb6n1p4DUmsQrrnmGk3ud5DqV/RCtm7dajpts+kaqS1s1oeYmBiH/eO1qFUJS1GafQhBIWGoulje6D21VgnXOu+GYwzLli3T5J67HAMgosHMvNnVMT0QYwACgXlJTU3Fw5Mno9zBoDeg/cD3yDkbEHJiMzYt/qfPjbl4sg7gfZnHBAKBDMwSa15t4uPj8fKb7yEgPLLRexEREZg1a1bday3ucUhgADoNHKvangNegaOBAVurYBCAZwBkA3jaLr0MYI9UPi2T0kHg119/nV9//XVFeT3FKG2z6Rqp7Y5uSkoKR0REqDaA6Qs2q8ne7EK+ZPh9PHzsLZID32rf41q6jkvgPhMe99QERXh6vyExCOxsDCAEQFNYxwnsXe55ABNU9EGas3v3btNpm03XSG13dJ2t3FXyFOkLNqtJNTMu5v4O6tRSsrtH7XtcS8mp4ygPcLzwTms0u9+OvIJ9AmBxdY5eSUwDFfg6RORwmh8RGV00xeg5DTU9o4AtiWm8/nCu5Dnu3GN3yn7nh1v4jg+3qGKH3sCDaaCLiWhdw6SFMxII/B1/izWvVUhmKWpsk1YCnTyJy73H7pY9JCgAldXqhdfwirEgR17BPgHoY5cGA5gL4E1X+bRISlsAM2fO5JkzZyrK6ylGaZtN10htd3TV7p822matFi5JsfV4PjcfEs8PPzlV8hy599jdsvce/wh3ufEhVexw93vg6ecMBWMAtQ5iZ4NDm4looydOR2+OHDliOm2z6Rqp7Y6u1DxvpX3TRtssNfdeqzn5NcyoKjiJ7IwKyXPk3mN3y16cm4WCCxeRda4UMVERDs+Ri7vjFFp9znLWAbS0exkAa0vgPWbu6rE40ScAbgJwlpnjXJ0v1gEIBN6FVPAyrebkb/otH/d8/Au+fGQQ+ndq6TqDE9wt+9IdWXjxmwOoZsYtPTvg8ZGX47LWTRVp673vsCfrAHYCSLf93Qrr1NCHVCrXYgBjVbqWQCDQGanQBfZz8tWkum4MwPNruVv2if1i8HPiSNx/TSxW7TuNUXM34on/7MJb//q32335XjMW5KhfSM8EIBbAfjnnKh0DePHFF/nFF19UlNdTjNI2m66R2ma3Wc9ZQOsO5XLza+7iyX9/VpXruVN2e5vzi8t59neH+NLxzzMFhbo9puPuGICnnzOUzgIiojAiepqIlhHR10T0DyIK08wjNdZPIKJ0IkrPy8tTdI3s7GxkZ2erXDLv1jabrpHaZrc5Pj6+UTA6NWa4OLpGdQ2j6nw+ck+fUsUOR2WXKserr76KuXPnIjU1FVFNQ/H82CsRkL4EXFV/PKK0tBRPPvmkU/ul9h2WGgvS7HN25BW4/hP6lwA+BjDSlpIB/NdVPrkJOrQABAJvxF/DOKsx00nqGs+/8S+2JKbxvpxCDS1wXY5aW6TWHDRMeoSrdgYkWgByKuhGYR8cHVOahAMQmBGtwhV4A2pMDZW6Rpv2l7IlMY0PnCzSzgAZ5ai1xdkeBZ7YrzZSDkDOUMqvRDSw9gURDQCgeyRQT5g2bRqmTZtmKm2z6RqprURXrc3cvdFmNaaGSp2bd+YU/ti4GPNef0X2tTzBlS2OBpKlyMzMhMViUdQdptXnLGc/gAEAJhFR7Z2IAXCIiPYBYGburlSciL4AMAJAKyLKAfASM3+s9HpSnDt3Tu1Ler222XSN1Faiq9b8+dyzeU5XxWqFM5ul4va7M8NF6hqt2nVAWVkxzhcWyL6WJ7iyxdGag5KSEsn7k5WVhYcenoyaGsa9994juxyafbcdNQu4fheNxVlylV/NJLqABP6CWitoB/1zLU/9eo82hVSIlmMAT732PlsS0/j42WINLXBdDme2OMrTMIVe0oaXbM/kispqXeyAB2MAn8s5pkcSDkDgL6g1BnDZtJVsSUzjHw6c0aikylBjgNvRNb5Kz2ZLYhpn5JdoUGr55ZCbR9oJEFsS03jQP9fyp1tOcNnFKk1t8MQB7GrwOgjAQVf5tEhKHcAzzzzDzzzzjKK8nmKUttl0jdRWqutpJVlTU8PN+o3nZv3Gc+yEqdwxOqbuWlOmTNF0hpFW99rVPVm6I4ub9RvPCY//XXVtVyixWcoJREVF8YYjZ/n2+ZvZkpjGfV/7gZM3HueS8krVtO2RcgCSg8BENI2IigF0J6LzRFRse50L4H9u9zUZSFlZGcoktpHzV21v1NU6+qE32uwMOXPQnVHDQE3VRUSWnkTmN+8gJzsLzNaolgsWLNA0QqcW91pOdM7qGkZN1UVUlDfel1drlNg8a9YshISENDp+/vx55OxYg/8+OghfTB6IK9o2xaxVhzBk9jp8sO43nC+v9FhbFo68gn0C8Lqrc/RKogvIt7B/mouKiuKQkBC/nPZoFOWVVWxJTOMWbTp4/TREKey/I4GBgQ7L3TE6mlO2ZfB9n/zCXaavYktiGheUVBhddNlERUXJ+jzSMwr4gUXb2ZKYxnEvreY53x/mcyrZCYkWgJxgcMMkHMdPnjgeJYhgcL5D7dNcw6mODdF6I29/IzU1tW7GScfoaJR2vwPnVs4FXPyOAe0CjSlF7ncEIFgSVyCmZQRGd2uLm3p0QM/oS3Qpoxq4G/ht/8ki/Gv9MXy3/wwiQgJxz0ALHh7aCW0ilQdgkAoGJ8cBrLB7GQagP4CdzHyt4tIoRKkDeOqppwAA8+bNU7tIXqtttO4333zjcPpcQ9SslIy2WWtdhxUmBSIoKBBVlRdd5lfT2aphs1Q0zoa0aNMBW/ccxhVtm4KIfO5zVhox9WhuMeavP4Zv95xC4bqFmNg3Ggv+9b5b2rUojgbKzOPs0vUA4mAdBxAIJJE7n91Xd8IyAkeLx8DVICKXi5G0jNCpFDnfkeDgYLw/9010bRcJImP24/UUpRFTr2gbiXl39cK6Z0ZgQKcohAYHql84R/1CzhIAArDP3XxqJDEG4DvIWSIvxgDcQzLuDFG9vvSIlu34kj5/5Us7RhsWZ0hqNk/hhYu8fFcOP5ayk4Oat3H5HYmKitK13FphdNwneDAG8L7twwCsLYaeADKYWf4yNpUQYwC+g6PuiuDgYDRr1gwFBQUe74RlRqS6EqLaXYr80zl1r08WlmHsOz/hqg7NsGTyQATovFLY0WcfEhqOvvckIrdNP1TVMFpHhqJ9XjrWfDQTFeXSs1u8bdzCV5HqApLzxH+fXYoHMNhVHq2S0hbAY489xo899piivJ5ilLY36Or91OMNNmuJwxWmFMhx/Qc3OvfLHVlsSUzjhT8d16QszmyOiYmRWP3all9fdYh3ZhZwdXVNnU3OWouOWgD+/jlroQ2lweCY+VMAX8C6I9geANs98URGEB4ejvDwcFNpe4Oup/PcPdHWE710G8aQv7RjNMJie6HTFVc3OndCn44YdVVbvPn9EfyWW6x6WRraXF3D2H6iAK+lHURWluO49RWFuZh6w5XoHdOirlVS+x2JiopSrK0Xauu6sy5GK5vldAGNAPApgAxY+/+jAdzHYhqoQGAoJ/IvYOScDZg3sSdu7XVpo/fziiswZt5P6NgiHF9PuQbBauyjaEfZxWpsOpaPNQfO4MfDZ1Fw4SJCAgNw6qMHceHcmUbnExE+//xzhw8Ceu+RazSOuskiIiKcbgrjCZ7sCfw2gNHMPJyZhwEYA+AdtQsoEAjco9pWMUpFA20dGYrXbo3D3pwizF9/XFXt1ftPo9erazD5s3SsPnAGQ7u0wr/+1hu7ZlyPj96d43DGDjNLhrv2mj1ydUKtcOAe46hfyD4B2CvnmB5J6RjA5MmTefLkyYryeopR2mbTNVLbKN1Dp4u4aY8xPPb2eKfn/f2LXXzZtJW8N1u9XbT6jb2DI3uO4Z+P5jmMaAmJPn0icni9lJSURivFQ0JCHI4b+cPnLDWjS+r+eKoNDzaESSeij4lohC0thHU8wGeIiopyq4/RH7S9UVfrWEDeaLM7uHt/qqoZAeGRaH5JC6fnzbw5DlFNQ/D0l7tRXlntcTkBILxpcwRHNMeQLq0QEtS4GrFYLA7zOXui5wZdQA1f1+LrnzPgfotHM5sdeQX7BCAUwNMAlgFYDuAfAEJd5dMiiXUAvos/b4EohTuzoJTcn91Zf7AlMY3XHnQdCnr94Vy2JKbxP1ceVGRLQ2auOMAdbn1O0j537VFrfwRfQe/fA5SGg/amJByA7yJ+4OpXgOkZBWxJTOP1h3NllWnasr0cOzWNt584p8Sketz29BtMwaFO7XPHAbrbJeIP6DlN2tQO4P777+f7779fUV5PMUrb23T1+IEbZfM9kybxtTffyav2nuKNR85yekYBd+gY7VaFruT+zHznI6bgsLrruqpAissrecjsH3no7HWSceflEhwarqpDd8cBett32xe0pRyAnD2BfZ7o6GjTaXubrhr7xCrV1pqy4BbYmZ+LKam76o6dyslxeG5mZibGzvsJTUOD0CQ0yPY3EM1atUNR3ulG57dpfyn25hTanRuEiOBAfPHFfzBr2lPgyvK66yYkJACA5DTCpqFBePuOnpiYvBWvf3cIr936F8U2V1Y4Xr3r7p7GtcyaNcvhtEhH8XK87bvt09qOvIK3Jl/qAjI69oe34c9jAJ9tOcGWxDTefCyPd5w4x+sP53Lr9pdKzoQZnjCT7/poK497/2ceOWc995/1A186/nmmoPpdKhQUylE3PcOWxLRGSSqOjpwn8NfSDrAlMY03Hjmr2OZmrdqr3qUnfjPaAQ+2hLwCwEIAawCsq02u8mmRfMUB+HNl5wn++gNftOn3RpuUpKSkSHbrSFWSn3+ewtEx1m0dO3SM5tffW8hbjuXzDwfO8De/5nDKtgz+cMMxfvv7wwwPutTKLlbxqLc38IBZa7nwwkVFNt/0939ygIsxAIH3IOUA5KwE3gPgQ1inftbNIWNm3aeCKl0JfM891rh1KSkpahfJIUrjf6uJ3jYbrWuk9sDRt2L/ySKcTF+D5uHBdcelwhersbrV0+/Yvpwi3Dp/M27u0QHvTOzptn63oX9FdqO3JpAAACAASURBVFYGougCsrKydA3uJ77b7iO1EljOGEAVMy9QpOoldO3aVVc9qX5Qpf2jStDbZqN1jdRuG90Jh8vyGq3ItVgsmo17uNNn7oi/dGyOJ0Zejnd//A1jrm6LsXHt3dJv0SEWJWFtkPHDIrfyqYH4bquIo2aBfQLwMoDHALQH0LI2ucqnRfKVLiCzTXm057fcYh70z7Wy5qb7Cws2HGNLYhqXVlTVO651V6CnXWoXq6r5pvd+5t4z13BecblbeZ9a8isPmf2jW3kExgEPVgLfB+A5AFtg7QbaCUCViGxENJaIjhDRMSKaqsY1vQGlOwD5A1kFF3CqqBxTUnZh3WFzbBxXXWPtRg1o8GtqGL3TYrGoGuzL02irwYEBmHtnDxRXVGH6sn21D3yyqGFGgI/u0CWww5FX0CMBCARwHEBnACGwhpru5iyP0hbAxIkTeeLEiYryKsU+zrkRg2NG2MzMPGzszRxx5VDuP+sH7jJ9Fa87JG+RkhoYZXPvETdyxJVDubKqcUwcrVHD5uSNx9mSmMZfpWc3ek+qlXH5wNHcpsdIj3SVYtTnbJSuGtpQug6AiIIBTAEwzHZoA4CPmLnSQ9/TH8AxZv7dprMEwC0ADnp43Ub07On+IJenxMfHIz4+Hm+88Ubdaz0xwmYAsFxxNXZkbELW/Adw5uRJjP6gNZ5/4WXMem6K5tpG2dz+sqvwO+cb8kSshs0PDumEHw7m4uUVBzDosih0uMQad75hyGL7tQatYq5ATUmFx9pKMOpzVlM3NTUVSUlJsgfQNbPZkVfg+k/q/4Z1P4BrbWkRgH+7yifjuhPsrwPgXgAfODgvAdYup/SYmBjFHlDgPkr6mP/+6nsO57NPf2u+DiU2hre/P8yWxDSji+EUV59lZv4FvurF7/ief2/jmhrrbl3OxrIe+Sydr5+7wQhTfB4jponDg3UAe+QcczcBuMOBA3jfWR4jB4H9dQ67FK6+pFL3o1U7xwuggpq1kR2zxtd4c/Uh7jxtpa6aWgSaS9mWwZbENP5sywlmdh6eYvKnO3jMOxtN97tQAyMmiXjiAHYBuMzudWcAu1zlk3HdQQC+t3s9DcA0Z3mUOoDbbruNb7vtNkV5mT3z2J5qK8VTXWdfUkf3Q6qy+DMRd0laxRtkrD5VWqkYda+vvuZ6btL1Gt30tAo0V1NTw/d+/Atf+cJ3fCKvxGm+2D4juVl0V0MWPPrqb6oWJXGfPNWWcgByZgE9B2A9EW0goo2wrgR+RkY+V+wA0IWIOhFRCIC7AHyrwnUbMWjQIAwaNEhxfk927/FUWyme6jpby+Dofli/Y9J0jI7G5a2bYvJn6dh4NE/yvNp+58zMTDBzXb+znL0DtLjXcmL0R1/ZAxEdr3Irjye4+32Uuy6FiPDm7d0RHEh45r978Opr0rPZWl32F5TmnzRkVytf/U3VomT3M81sduQVGiZY9wToDqAHVNwLAMCNAI7COhsoydX5RnUBmTFUrbOnP9dP+3D4VFhQUsE3zPuJuyStkoxD401rKOQ+ac9ccYC7vfidW3k8wd3vo7v3dPmuHLYkpvGCDcckW2OTPv6FAfP9LtTAJ8YAAFxr+3uboySVT8tklAPwpkpJL5x9SaXuh6OKoGEXTkFJBY+d9xNfkbSKfzra2Al4k7OV+7m/9L/9HPfSarfy6FGuWtytcGpqavjRz9O5y/RVfOh0kcNz7vn3Ng5v0dZ0vwu10HvsRIkDeMX2d5GD9IlUPi2TUgcwbtw4HjdunKK8zJ55bE+1laKGrtSX1NH9cKcSOFdSwWPe2chXJK3in4/m1XvPkwpU7Xst1xl16TeCm3Ud6FYeT1DyfXS3wskvLuc+r67hG+b95HDP30t7DOFmHbsYMgbgy78po7TddgDemJQ6gHnz5vG8efMU5a1FqcdWQ1sJWuvatwQaVXoBQS7vj5QT8MTZqm2zXGc06sHnueMNU9zK4yn2979FixYeV7qOvt/f7z/NlsQ0fvv7w43O73XnU9zzjicNmQXkr78pLbUVOwAATwJoBoBgXROwC8BoV/m0SFp3AfnilDZvKLN9GZq2ascdb3teVj57J7Dpt/pOwGibasshxxlN/XoP933tB7fyeBPOyvz00t3cedpK3p31R708d3y4he/8cItBJRa4iycOYI/t7xhYZ+n0gArTQJUkLR2Av/1w9ebno3k85p2NbElM4yf+s0t2vvzich7zzkbu+sIq3vxbnusMOiPHGT333908YNZat/LoUS65OGu1FJVd5EH/XMvXzlnPZRf/DHY3YcFmvjt5qxqmCHTAEwew1/b3XQDjbf//6iqfFkmpAxg7diyPHTvW6TlaNd3laCvFWZm11LXnt9zz/MCi7WxJTOMhs3/kPoNHuq2bX1zOo+c6dwJyKjy9bG5IbM/BfMkV/XTTU9vxuxq3+PloHlsS03jmigN1edp2G8Dt4waqYo+7GPU5G6WrhraUA5CzH8BOIloDoBOAaUQUCcCz3Sx0Zty4cS7P0SqGvxxtpTgr8/PPP6+ZLgCcK6nAuz/+htRfshARHIhpN1yJ+66JxSdND7t9raimoUidPAB/W7gND366A5/c3w/XXNaq7n1nMWns46doea+d0an3MGSeu1DvmLuxXtzB2ToAJRqu9mse0qUVJg2y4JPNJ3B9t7YY2DkKbeIGIzw4UJkBHmLU52yUrqbajryCfQIQAKA3gEtsr1sC6O4qnxZJyy4gX5zqaUSZyyur+KONxzjupdXcedpKfvGbfZzfIJa80u6JvOJyvn7uBu76wireciy/7ri3fzb/959dPOzNdXWvte6aU3umkZzyXqio5OFvruPBb/zIxeWVPO79n/m+T35RxR6B9sCDLqDBAJrY/r8HwFwAFlf5tEhiDKA+epa5pqaGn/nnBxx6SRsGiJtEteO35/9b9TLlFZfzqLc38JUvfMdbj+dzSkqKw8rOkwpPbR5L3ckj31pf91prh6XF9eU47fSMAu40NY0Tv9rDN777Ez+4aLsHVgj0xBMHsBfWGUA9bP8/CWCjq3xaJKUO4LrrruPrrrvO5XlaDN7J1VaKVJnV1N2VWcB973+pUZRPRxV7WFiYx5XT2fNWJ9D+1uc4LDxc0gE0vKY7Nnv6WdvnDwwO4Yi2f5ZF67UARj6svPHdIbYkpnFEbE/u0E2/cQ97tP5NeZuuGtqeOIBdtr8zADxkf0zvpNQBJCcnc3Jycr1jSisAd/M50tYDNXRz/ijlv3+xiy2JaRzSvI2sSlitp/Wz58s5TGKlqVSF58xm+88tKiqKg4ODFVegDoPhBf659kGPLiv7dQAtW7bUraVaXlnFY97ZyC3HPMFDH5iui2ZDfPk3ZZS2Jw5gI6yROn8D0A7Wnbz2ucqnRVKrC0jpE5QvdhMp4XzZRZ793SG+ImkVX5G0it9afVj2U61U5RcYGOj2fXIWc8ida8lZuexOBe2qgvf378n+k4V8+fSV/HjqTqOLIpCJJw6gHYCnAQy1vY4BMMlVPi2SWg5A6ROatw9GekplVTWnbsvkPq+uYUtiGj+15Fc++UcpM8u33Vll624lqNb9lrqO0laKHGfoLYvZtOKno2f54CnHcYIE3odiB2DNCwuAUbb/IwBEysmndlLqAIYPH87Dhw+ve620j1ZJvobaeuGu7sYjZ3n0XOtCrgkLNjda+Sn3qXb48OF85ZVXcmBgoMeVtyPNsPBwycpUyma50Utdla2mpoYPnz7PLdp08JoHAV/5fvmDti/bLOUA5OwJPBnWbRlbArgMwKUAPgRwnau83sL9999f77Wrec+A43nccvK50tYLubpHc4sxa+UhbDyah5iWEVgQ3xtj49qBGuxvWzu/3NXc9lrdBx980KGeO+sqGmqGNG+DliMmoevgGxyeL2Wz1OdmT22c+4ZU1zB2Zf2BNQfOYM3BXGSeK0VA/7sR+P0HqK6svyfujTfeKMMqdfH275c/afulzY68gn0CsBtACOxW/8LPxwCk3p8yZYpkvsLSi7wrs4C/Ss/m2d8d4kc+S+dRb2/gm977mSurGkdTNJq84nKevmwvd5qaxnEvrebkjce5vLLKdUaZOOu+Udo9kltUxiPfWs/dXvyOd5w4J7ssjj7PkJAQjoqKcliGsotV/OOhM5z41Z667rDLp6/kSR//wqnbMjm3qIynTJnSqGXhT/38Av8CEi0Asr4nDRH9wswDiOhXZu5FREGwzgLqrqIfkkXfvn05PT3d7XyVlZUAgODg4LpjzlZqxsbGSj7pPzP9ZcyaOQNnT59Es6h2uGpcAqo6D0F+yZ9Pg0EBhJgo605Kx88UYdeM6xEVGdHoelriyGYAKK+sxqLNGfjX+mMoq6zGvQMt+Pt1XdCySYiqul9++WW91buA9Sn7vvvuw6efftroeHJysqxVrLnny3F38jbkni/HZw/1Rx9Ly0baDW0GXK/MLSqrxIYjZ7HmQC42HDmLCxer0TQ0CCO6tsaYq9thRNfWiAz787pS3xGLxYKMjAyXdqiFM5v9UddIbV+2mYh2MnPfRsdlOIA3ARQCmATg/wA8BuAgM2u775sDlDqAESNGAAA2bNgg6/yAgAA4vi+EqJueRuFPn6H6fD6Cm7dGj/FTMPKv49G5dVNc1ropOrdugpiWEQgODMCizScw5e6bERNeiYsV5ZqEBZCioc3MjLS9p/HGd4dxsrAMo65qg6k3XIXL2zTVTNdRpZuUlORxxZl7vhx3JW9DXnEFPn2wP/pYWjTSlsOZonL8cCgXaw6cwdbj51BVw2gdGYrru7XF6G5tMeiyKIQGOQ53IPUdISLU1OgXKcVdm31d10htX7ZZygHIiQWUCOBhAPsAPAJgFaxhoX2Ghx9+uNGxmhrGycIyHM8rwe95F+r9DYhsherzjfetDY9shuK181FdXgYAqCw6i52fzkT64ldgsVgwa9YsXG9XsQcFEIKiYpB5cC0uXrwIQDqOjdrY27wz8w+8tvIgfs0qxFXtm+HNCd0x+PJWTnKroxsfH9/IxnvvvddhPnfGBto2C8MXkwfi7oXbcN8n2+ucgKPPuSHHzpZgzcEz+P5ALvZkFwIAOrVqgoeGdsLobu3QK/oSBASQi6vIG0fSAzk2+5Oukdr+aLPTFgARBcAaDTROE3U3UdoCOJ5Xgn05Rfg9rwTHbZX8ifwLqKiqQcmB9XVP9OEt2mDkPU+idbNQLHn7BVTYKnrA2k0RHh6Oc+fOSeoEBwdj0aJFdZXef37JwqTRfR06Ez26CrILSjF79WGk7T2N1pGheG50V9zepyMCZVRwWqFm18mZonLclbwV+SUX8dlD/dE7pkWjc2pqGHtyCvH9gVysOXgGv+dZg7b16Ngco69uhzFXt8VlrZs2GvR2RcMAdYB7XVkCgZ540gWUCmAaM3sWFlMFlDqAxKXb8cX2bASFhCG6ZYS1q6ZVE5zetRafvDEV5WX1K/rk5GQAjWe83HvvvRJdQ38SFRWF/Px8AMDSHVm4q38srGOE9dG6q2DplmNI+t8+BIWEIWHYZXhkWGc0CZXT4POM2goxIsLxmIfaFefpojLclbwNBSUX8dHf4tAzugWCQsKw7fdz+P7AGfxwMBdniysQFEAY2DkKY65ui1Hd2qJ983BlBjawpfY70rFjR7z++uu6V/6u7re/6Rqp7cs2SzkAObOA1gEoBvAjrBvCfAvgW1f5tEhKZwENuGYI9x80pNEsF3cXGsldUFTLf9OzGYHBDs8JDAzUdJFQ2669uVmnHnULubTEflZPaGgoX3nllbLPV8P+U4WlPOzNdRxh+Qt3uKoPx81YzZbENL7qxe94Sko6L9+Vw4UXLnqk4Qxfnh/ua7pGavuyzfBgJfBwR8lVPi2SUgewZMkSfuKJJxpVOu4u7JIbUqCW5btyuGnvmzg4JMTp+VpMHxyc8Cr3f/CVunJrtSpVaoqlJxpKynvyj1LuFv8ix94xnZ//7x5ee/BMvR2sPLm2K5YsWcJLlizx+Dq+pC1s9i1txQ7Am5JSByA1rz8qKsrtFZ32QbgcpaioqLpz/7f7pHVT7fn//jNypAorZB2Vp2GFVrtnq9ZxadQOjyG3vI7srqyq5qrqGo+vLRD4G560AIoBnG+QsgEsB9DZVX41k1IHEB0dLVlZK60QUlJSOKTBk33DJ9+Ve09x9FNLeceR7LpjaoYKdlahjXv7e57w7g+axy9SO/SxnPJK2b1w4UIuLCz06NpKKCwsdKqrJUZpC5t9S9sTB/AKrNM/IwE0gzUsxAwAEwFscJVf4pp3ADgA69aSfeXmU+oApJ7WicijLgFXeb/bd5pDo+O476DBdcfUrIScXSvq8p7ctmtvzWPTq12pyimvlGZoaKjTflKt7oUv9w37mq6R2r5ssycO4BcHx7bZ/u5xlV/imlcB6Apggx4OoFWrVpo+BUvxw4Ez3PrW6Tw3+bO6Y2p2Qzir0Ho/+Cpf+/hszVsAjuwJDQ1V3K0ip7zO7P766689urYSvv76a6e6WmKUtrDZt7Q9cQBbAdwJ697AAbb/ax3Ablf5XVxbFwdgVN/vusO5bElM412ZBY3Ko8ZApLMKbcw7Gznhsx262K7mwKqc8iqtyMUYgMCseOIAOgNYASAfQJ7t/8sBhAMY4iq/i2u7dACwdjmlA0iPiYlRZHxeXh4vWLBAs5kwUmw8cpY7/l8q/7DzqCbXd1ShBQcH2wa3iZu0bMMpKSm6xqbPy8vjvLw8j67hqrxSFfmCBQtcamtxL9Sw2de0hc2+pa3YAShNANYC2O8g3WJ3ji4tAKP67jb/lseh0XHca8A1mmk03Oqw4cC03k+4et1rRxW56Bv2f10jtX3ZZikHIGc/gCsALADQlpnjiKg7gJuZ+TVn+Zh5lKtr68UzzzxjiG5gAKFZ//G46/qummnYx9uJjY1tFKqitLQUSUlJuq1Q1eteO4oz1KxZM120G2LU98tIbWGzf2jLCQWxEcBzAD5i5l62Y/tZhfhARLQBwLPMLCu+g9JQEEaRnlGACR9uxecP9cfQLq011/OWCJUCgcC7kAoFESAjbwQzb29wrMrDwownohwAgwCsJKLvPbmeK86cOYMzZ85oKeGQwABCdckfOJubq4ueVCRKPSNUGnWvjdQWNptD2x9tlhMdLJ+ILoO1TxlENAHAaU9EmXk5rAvJdOGuu+4CoH8c76CAAOR9Oxszt0fi9u1bNNebNWuWw0BrjrY61Aqj7rWR2sJmfRE2q4ccB/A4gGQAVxLRSQAnAPhUvNupU6caohsQADQfeAfuvO5yXfTs99DNzMxERPOWSP7Xe7pGqDTqXquh7WrXMK10PcEobWGzn2g7Ghl2lAA0gXU1cBCAeLn51Exq7QmsF4dPn2dLYhqv3HtK1vmOZrYonbZ45Qvf8WtpBzwpvqkQawQE/gwkZgFJjgEQUTMimkZEHxDR9QBKAdwH4Bisi8F8huzsbGRnZ7uVJzU1FbGxsQgICEBsbCxSU1Pd1g0MAKrO5+GbTXvxZXo2vtt3Gj//lodZ7yXj0ugYBAQEIMZiQWpqal2c/MzMTDAzMjMz8eCDD+KBBx6odywhIUFWWcoKc1FSoM/Ygz1K7rU3aCclJdXrOgP+nEGlpa6nGKUtbPYPbclZQET0PwB/wLoS+DoALQCEAHiSmXerXhIZ6LUnsFqblhSWXkTHbn1RVcNo97c3AAAlB9ajYPUH4Ko/N5GnoFBQcAhqyoplXbd1+0vx3w2/IjIsCJGhQWgaFoSmoUFoEhJUt51hWMxfcGmLcBzf03D8Xlt8dd9UT2ZQ+arNvqhrpLYv26xkT+DOzPwXW+Z/w7oSOIaZ5dVSXsQLL7zg1vnOngbdcQCXRITg64/moLyyBn0GD0NJRRVG9n20XuUPAFxV0eiYM/JOn8SIrm0R2KwVwjr3Q/nvO1B9Ph+BzVqh3XUPoGPf0Wh+zV0Y3ftS2ddUC3fvtbdoe7LHr6/a7Iu6Rmr7o83OWgC7mLm31Gsj0GsdgJbz6aWurRbBoWEY/cgMdBo4FlOGX4ZuHYxZHOVriD1+Bf6MknUAPYjovC0VA+he+z8RndeuqOrz+++/4/fff5d9vprz6RtqS10jKiqq0X6fISEhCA4OdkuvsqIc+//3Ef4xoDnCyvPdLq+nuHuvvUU7Pj4eycnJsFgsICJYLBbZlb+v2uyLukZq+6XNjkaGvTXpFQtIzRkhDbWdXdvVLCD7PK5SaGhoXYRMf4wF5E3awmZzaPuyzTDzlpAbNmzgDRs2uJVHraiRjrSVXlsqDHLD1NBZ6DmdUcm99nVtYbM5tH3ZZikH4DIWkDfh7bGAlC4kcuf6DfupG0JEDscYLBYLMjIyVCuLQCDwHTyJBeTzHDlyBEeOHNFUw9E8/oSEBMyZM0c1bUf91FOmTKn3WsqhZ2VlqVIGV+hxr71NW9hsDm2/tNlRs8BbkzfvByBnn1olXT/u5tF6C0hX+HI/qa/pGqktbPYtbZh5DGDz5s28efNmRXnl4myf2s2bNysaWNYrj5roca+9TVvYbA5tX7bZ1A5AD1w9eSt5Mvdk71u9t78UCATei5QDkBMN1OfZv38/ACAuzuM9bCSRCsU8ZcoU7N+/X7IP3lnfvJI8gHWsoEePHgC0tdkRetxrb9MWNuuLsFk9TDELSK8YHo5mAS1cuBAAkJGR4TDUgLPZObGxsW7nqUXES/F/XSO1hc36olUsIFM4gB07dgAA+vXrp3aRZGsfPXrU7VADnoQnMMpmb7jXwmb/1TVS25dtlnIAhvfru5O8eQxADnrMAhIIBIKGwMwLwXbvtkav7tmzp9pF8lpts+kaqS1s1hdhs/uYugvIl/vuhK73awub9UXY7D6mdgC+7LmFrvdrC5v1RdjsPqZ2AAKBQGBmTB0LaMeOHXWj6GbRNpuukdrCZnNo+6PNpmgB+HLfnRJSU1Px0EMPoaKiAhaLRfWopM4w2702UtdIbWGzvvjVGAARvQVgHICLAI4DeICZC13lU+oA/HEFnxRGb21opntttK6R2sJmffFU29scwGgA65i5iohmAwAzJ7rKJ8YAXOPJ6mGBQOCfeNUYADOvYeYq28ttADpqqbdlyxZs2bJFSwmv0VYaP0gtzHSvjdY1UlvY7B/aho8BENEKAEuZOUXi/QQACQAQExPTx9HTrSt8ue/OXYxuAZjpXhuta6S2sFlffG4MgIjWAmjn4K0kZv6f7ZwkAH0B3MYyCqK0C6h2J52uXbu6nddT9NY2egzATPfaaF0jtYXN+uKptleNAQAAEd0H4FEA1zGz9Ca3dogxAHlovTexQCDwLaQcgCH7ARDRWACJAIbLrfw9YePGjQCA4cOHay3lFdrx8fHo2LGj7rqA+e61kbpGagub9UUrbaNmAR0DEArgnO3QNmZ+1FU+sQ5A6HqjtrBZX4TN7uN1XUBKUOoAfv/9dwBA586d1S6Sqtpqdt0YZbOv3Gt/0DVSW9isL55qm9oB+AJGD94KBAL/xavWAejN2rVrsXbtWq/WTkpKqlf5A0BpaSmSkpI01VUbX7jX/qJrpLaw2T+0TdEC8IW+u4CAADj6LIgINTU1mumqjS/ca3/RNVJb2KwvYgwAyh1AdnY2ACA6OlrtIqmmrfYCLqNs9oV77S+6RmoLm/XFU21TOwBfQIwBCAQCrTD1GMDq1auxevVqr9aOj49HcnIyLBYLiAgWi8Wjyt8om33hXvuLrpHawmb/0DZFC8CX++6ErvdrC5v1RdjsPqbuAjpz5gwAoF07R6GJtMUobbPpGqktbNYXYbP7mNoBCAQCgZkx9RjAihUrsGLFClNpm03XSG1hszm0/dFmU7QAfLnvTuh6v7awWV+Eze5j6i6g/Px8AECrVq3ULpLXaptN10htYbO+CJvdx9QOQCAQCMyMqccAli1bhmXLlplK22y6RmoLm82h7Y82m6IF4Mt9d0LX+7WFzfoibHYfU3cBFRUVAQCaN2+udpG8VttsukZqC5v1RdjsPqZ2AAKBQGBmTD0GsHTpUixdutRU2mbTNVJb2GwObX+02RQtAF/uuxO63q8tbNYXYbP7mLoLqDbEckREhNpF8lpts+kaqS1s1hdhs/tIOYAgz4rlGxjxgRmtbTZdI7WFzebQ9kebTTEGkJKSgpSUFFNpm03XSG1hszm0/dFmU3QB+XLfndD1fm1hs74Im93H1GMAlZWVAIDg4GC1i+S12mbTNVJb2Kwvwmb38aoxACJ6FcAtAGoAnAVwPzOf0krPiA/MaG2z6RqpLWw2h7Y/2mzUGMBbzNydmXsCSAMwQ0uxxYsXY/HixVpKeJ222XSN1BY2m0PbH202vAuIiKYBiGHmKa7OFWMAQtcbtYXN+iJsdh+vGwMgolkAJgEoAjCSmfMkzksAkAAAMTExfTIzM/UrpEAgEPgBujsAIloLwNEOxknM/D+786YBCGPml1xdU8QCEggEAvfRfRCYmUfJPPU/AFYCcOkABAKBQKAehgwCE1EXu5c3AzhsRDkEAoHAzBgVCuINIuoK6zTQTACPGlQOgUAgMC2GOABmvt0IXYFAIBD8iSliAQkEAoGgMcIBCAQCgUkRDkAgEAhMinAAAoFAYFIMDwXhDkSUB+usISW0ApCvYnGMRNjiffiLHYCwxVvxxBYLM7dueNCnHIAnEFG6o5VwvoiwxfvwFzsAYYu3ooUtogtIIBAITIpwAAKBQGBSzOQAko0ugIoIW7wPf7EDELZ4K6rbYpoxAIFAIBDUx0wtAIFAIBDYIRyAQCAQmBRTOQAiepWI9hLRbiJaQ0QdjC6TUojoLSI6bLNnORFdYnSZlEBEdxDRASKqISKfnK5HRGOJ6AgRHSOiqUaXRylE9AkRnSWi/UaXxROIKJqI1hPRIdt360mjy6QUIgojou1EtMdmyyuqXt9MYwBE1IyZz9v+/zuAbszsk6GoiWg0gHXMXEVEswGAmRMNLpbbENFVsIYF/wjAs8zs+w83UgAABQ1JREFUU1u+EVEggKMArgeQA2AHgLuZ+aChBVMAEQ0DUALgM2aOM7o8SiGi9gDaM/MuIooEsBPArT76mRCAJsxcQkTBADYBeJKZt6lxfVO1AGorfxtNAPis92PmNcxcZXu5DUBHI8ujFGY+xMxHjC6HB/QHcIyZf2fmiwCWALjF4DIpgpl/AlBgdDk8hZlPM/Mu2//FAA4BuNTYUimDrZTYXgbbkmr1lqkcAGDdjJ6IsgHEA5hhdHlU4kEA3xldCJNyKYBsu9c58NHKxh8holgAvQD8YmxJlENEgUS0G8BZAD8ws2q2+J0DIKK1RLTfQboFAJg5iZmjAaQCeMLY0jrHlS22c5IAVMFqj1cixw4fhhwc89mWpT9BRE0BfA3gqQatf5+CmauZuSesrfz+RKRa95xRW0Jqhj9tRu/KFiK6D8BNAK5jLx7MceMz8UVyAETbve4I4JRBZRHYsPWXfw0glZmXGV0eNWDmQiLaAGAsAFUG6v2uBeAMf9qMnojGAkgEcDMzlxpdHhOzA0AXIupERCEA7gLwrcFlMjW2gdOPARxi5rlGl8cTiKh17Qw/IgoHMAoq1ltmmwX0NYB6m9Ez80ljS6UMIjoGIBTAOduhbb44o4mIxgN4H0BrAIUAdjPzGGNL5R5EdCOAeQACAXzCzLMMLpIiiOgLACNgDTucC+AlZv7Y0EIpgIiGAPgZwD5Yf+sAMJ2ZVxlXKmUQUXcAn8L63QoA8CUzz1Tt+mZyAAKBQCD4E1N1AQkEAoHgT4QDEAgEApMiHIBAIBCYFOEABAKBwKQIByAQCAQmRTgAgd9ARCWuz3L7mrFE9Dcn779li9L4loJr97RNIRUIDEE4AIHAObEAJB0AgEcA9Gbm5xRcuycAtxwAWRG/W4EqiC+SwO8gohFEtIGIvrLtmZBqWx0KIsogotm2GOvbiehy2/HFRDTB7hq1rYk3AAy17SHxjwY638IaVfYXIppoW7X5NRHtsKXBtvP6E9EWIvrV9rerbdXwTAATbdeeSEQvE9Gzdtffb2uBxNpi288HsAtANBE9Z9PYq3aMeIF5EA5A4K/0AvAUgG4AOgMYbPfeeWbuD+ADWFfwOmMqgJ+ZuSczv2P/BjPfDKDM9t5SAO8CeIeZ+wG4HcC/baceBjCMmXvBGoH2n7bQ0TMALLXL74yusMbp72X7vwusoah7Auhji+UvELiF3wWDEwhsbGfmHACwhdKNhXUzDQD4wu7vO42zKmYUgG62xgYANLNtSNIcwKe2WFQMa0x3d8m02wRktC39anvdFFaH8JPSggvMiXAAAn+lwu7/atT/rrOD/6tgaxHbuotCFGgGABjEzGX2B4nofQDrmXm8LT79Bon8dWWwEWb3/wX7SwJ4nZk/UlBGgaAO0QUkMCMT7f5utf2fAaCP7f9b8OdTejGASJnXXQO7PSaIqKft3+YAaoMO3m93fsNrZwDobcvbG0AnCZ3vATxoi3cPIrqUiNrILKNAUIdwAAIzEkpEvwB4EkDtwO5CAMOJaDuAAfjziXsvgCqybsr9j8aXqsffAfS1DcweBFAbnfVNAK8T0WZYozrWsh7WLqPdRDQR1vj1LW1dVlNg3Wu4Ecy8Btb9LLYS0T4AX0G+kxII6hDRQAWmgogyAPRl5nyjyyIQGI1oAQgEAoFJES0AgUAgMCmiBSAQCAQmRTgAgUAgMCnCAQgEAoFJEQ5AIBAITIpwAAKBQGBS/h86r6VNHfdw0QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "reg = LinearRegression().fit(X_product,y)\n",
    "line_product = np.hstack([line_binned,line*line_binned])\n",
    "plt.plot(line,reg.predict(line_product),label='linear regression product')\n",
    "\n",
    "for bin in bins:\n",
    "    plt.plot([bin,bin],[-3,3],':',c='k')\n",
    "    \n",
    "plt.plot(X[:,0],y,'o',c='k')\n",
    "plt.ylabel(\"Regression output\")\n",
    "plt.xlabel(\"Input feature\")\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用多项式特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "# 包含直到x ** 10的多项式\n",
    "# 默认的include_bias=True 添加恒等于1的常数特征\n",
    "poly = PolynomialFeatures(degree=10,include_bias=False)\n",
    "poly.fit(X)\n",
    "X_poly=poly.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_poly.shape:(100, 10)\n"
     ]
    }
   ],
   "source": [
    "print(f\"X_poly.shape:{X_poly.shape}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X:\n",
      "[[-0.75275929]\n",
      " [ 2.70428584]\n",
      " [ 1.39196365]\n",
      " [ 0.59195091]\n",
      " [-2.06388816]]\n",
      "X_poly:\n",
      "[[-7.52759287e-01  5.66646544e-01 -4.26548448e-01  3.21088306e-01\n",
      "  -2.41702204e-01  1.81943579e-01 -1.36959719e-01  1.03097700e-01\n",
      "  -7.76077513e-02  5.84199555e-02]\n",
      " [ 2.70428584e+00  7.31316190e+00  1.97768801e+01  5.34823369e+01\n",
      "   1.44631526e+02  3.91124988e+02  1.05771377e+03  2.86036036e+03\n",
      "   7.73523202e+03  2.09182784e+04]\n",
      " [ 1.39196365e+00  1.93756281e+00  2.69701700e+00  3.75414962e+00\n",
      "   5.22563982e+00  7.27390068e+00  1.01250053e+01  1.40936394e+01\n",
      "   1.96178338e+01  2.73073115e+01]\n",
      " [ 5.91950905e-01  3.50405874e-01  2.07423074e-01  1.22784277e-01\n",
      "   7.26822637e-02  4.30243318e-02  2.54682921e-02  1.50759786e-02\n",
      "   8.92423917e-03  5.28271146e-03]\n",
      " [-2.06388816e+00  4.25963433e+00 -8.79140884e+00  1.81444846e+01\n",
      "  -3.74481869e+01  7.72888694e+01 -1.59515582e+02  3.29222321e+02\n",
      "  -6.79478050e+02  1.40236670e+03]]\n"
     ]
    }
   ],
   "source": [
    "# 比较X_poly和x的元素\n",
    "print(f\"X:\\n{X[:5]}\")\n",
    "print(f\"X_poly:\\n{X_poly[:5]}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x170bff84910>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEGCAYAAABsLkJ6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3wUdf4/8Nc7nQChhIC0bEBBaugK6hc8C/JDxYY1KuppLMed4qkBowiesZ/I4YmCSjER9SynF0AxoAICYkLvICYh1ARIr5t9//7YTdgkW2Z3Z3a2vJ+PxzyyZcp7Nrvznvm0IWaGEEKI4BOidwBCCCH0IQlACCGClCQAIYQIUpIAhBAiSEkCEEKIIBWmdwCu6NSpEyckJOgdhhBC+JWcnJwiZo5r/rpfJYCEhARkZ2frHYYQQvgVIsqz9boUAQkhRJCSBCCEEEFKEoAQQgQpv6oDsKWurg4FBQWorq7WOxQh3BIVFYUePXogPDxc71BEkPH7BFBQUIC2bdsiISEBRKR3OEK4hJlx+vRpFBQUoFevXnqHI4KM3xcBVVdXIzY2Vg7+wi8REWJjY+UKVujC7xMAADn4C78m31+hl4BIAEIIEahOlFTjn6v243BhuerrlgSgg8svv1y3Dm2XXHKJ03natGnj8PVjx45h8uTJqsblj9577z0sXbpU7zBEgDtythLz1hzC0eIq1dft95XAwjUbNmzweB3dunXDF198oUI09hmNRoSF2f56OnpPCWYGMyMkxLPzn0ceecSj5YVQoqLGCABoHan+4VquADyUm5uLfv36YcqUKUhMTMTkyZNRWVkJAFi9ejWGDRuGwYMH44EHHkBNTU2TZT/88ENMmzat8fnChQvx5JNPIjc3F/3798dDDz2EgQMHYvz48aiqMmf/bdu2YfTo0UhMTMRNN92Es2fPAjBfVUybNg1jx45F//798dtvv+Hmm29Gnz598NxzzzVuo+Esvry8HFdeeSWGDx+OwYMH45tvvnFpnwcNGgQAWLx4MW6++WZMmDABffr0wTPPPNM436pVqzBmzBgMHz4ct956K8rLzZewL774IkaNGoVBgwYhOTkZDXelu/zyy/Hss89i3LhxmDt3bpNtzpo1C8nJyRg/fjzuvfdeFBYW4pZbbsGoUaMwatQo/PLLLwCAwsJCXH311Rg+fDgefvhhGAwGFBUVNX6mjz32GIYPH44jR47gjTfewKhRo5CYmIgXXngBAFBRUYFrr70WQ4YMwaBBg/DZZ58BAKZPn44BAwYgMTERTz31VGNMb775ptP/S0pKCi666CL07dsX69atU/w5CwEAlbX1AIDWEeongIC6Apj9v93Yc6xU1XUO6BaDF64f6HCe/fv348MPP8Sll16KBx54AO+++y6mTp2K++67D6tXr0bfvn1x7733Yv78+XjiiScal7vjjjuQmJiI119/HeHh4Vi0aBHef/99AMDBgwexbNkyLFy4ELfddhu+/PJL3H333bj33nsxb948jBs3DjNnzsTs2bPx9ttvAwAiIiKwdu1azJ07FzfccANycnLQsWNHnH/++Zg2bRpiY2Mbtx0VFYWvv/4aMTExKCoqwujRozFp0iS3KiS3bduGrVu3IjIyEhdeeCH++te/olWrVnjppZeQlZWF1q1b47XXXsNbb72FmTNnYurUqZg5cyYA4J577kFmZiauv/56AEBxcTF+/vlnm9vJycnB+vXr0apVK9x1112YNm0aLrvsMuTn5+Oaa67B3r17MXv2bFxxxRWYMWMGvvvuOyxYsKDJ/2nRokV49913sWrVKhw8eBCbN28GM2PSpElYu3YtCgsL0a1bNyxfvhwAUFJSgjNnzuDrr7/Gvn37QEQoLi5uEZuj/4vRaMTmzZuxYsUKzJ49G1lZWS5/xiJ4lVuuAKIjQlVft1wBqKBnz5649NJLAQB333031q9fj/3796NXr17o27cvAGDKlClYu3Ztk+Vat26NK664ApmZmdi3bx/q6uowePBgAECvXr0wdOhQAMCIESOQm5uLkpISFBcXY9y4cTbXOWnSJADA4MGDMXDgQHTt2hWRkZHo3bs3jhw50mTbzIxnn30WiYmJuOqqq3D06FGcPHnSrf2/8sor0a5dO0RFRWHAgAHIy8vDpk2bsGfPHlx66aUYOnQolixZgrw883hUP/74Iy6++GIMHjwYa9aswe7duxvXdfvtt9vdzqRJk9CqVSsAQFZWFqZOnYqhQ4di0qRJKC0tRVlZGdavX4877rgDADBhwgR06NChcXmDwYDRo0cDMF+drFq1CsOGDcPw4cOxb98+HDx4EIMHD0ZWVhZSUlKwbt06tGvXDjExMYiKisKDDz6Ir776CtHR0U3icvZ/ufnmmwGc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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "reg = LinearRegression().fit(X_poly,y)\n",
    "line_poly = poly.transform(line)\n",
    "plt.plot(line,reg.predict(line_poly),label='polynomial linear regression')\n",
    "plt.plot(X[:,0],y,'o',c='k')\n",
    "plt.ylabel(\"Regression output\")\n",
    "plt.xlabel(\"Input feature\")\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 原始数据上使用svm模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x170bffb4d60>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.svm import SVR\n",
    "\n",
    "for gamma in [1,10]:\n",
    "    svr = SVR(gamma=gamma).fit(X,y)\n",
    "    plt.plot(line,svr.predict(line),label='SVR gamma={}'.format(gamma))\n",
    "    \n",
    "plt.plot(X[:,0],y,'o',c='k')\n",
    "plt.ylabel(\"Regression output\")\n",
    "plt.xlabel(\"Input feature\")\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 多项式特征应用于测试波士顿房价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train.shape:(379, 13)\n",
      "X_train_poly.shape:(379, 105)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_boston\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "boston = load_boston()\n",
    "X_train,X_test,y_train,y_test = train_test_split(boston.data,boston.target,random_state=0)\n",
    "\n",
    "# 缩放数据\n",
    "scaler = MinMaxScaler()\n",
    "scaler.fit(X_train)\n",
    "X_train_scaled=scaler.transform(X_train)\n",
    "X_test_scaled = scaler.transform(X_test)\n",
    "\n",
    "# 下面提取多项式特证,最高次数为2\n",
    "poly = PolynomialFeatures(degree=2).fit(X_train_scaled)\n",
    "X_train_poly = poly.transform(X_train_scaled)\n",
    "X_test_poly = poly.transform(X_test_scaled)\n",
    "print(f\"X_train.shape:{X_train.shape}\")\n",
    "print(f\"X_train_poly.shape:{X_train_poly.shape}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "多项式特征:['1', 'x0', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10', 'x11', 'x12', 'x0^2', 'x0 x1', 'x0 x2', 'x0 x3', 'x0 x4', 'x0 x5', 'x0 x6', 'x0 x7', 'x0 x8', 'x0 x9', 'x0 x10', 'x0 x11', 'x0 x12', 'x1^2', 'x1 x2', 'x1 x3', 'x1 x4', 'x1 x5', 'x1 x6', 'x1 x7', 'x1 x8', 'x1 x9', 'x1 x10', 'x1 x11', 'x1 x12', 'x2^2', 'x2 x3', 'x2 x4', 'x2 x5', 'x2 x6', 'x2 x7', 'x2 x8', 'x2 x9', 'x2 x10', 'x2 x11', 'x2 x12', 'x3^2', 'x3 x4', 'x3 x5', 'x3 x6', 'x3 x7', 'x3 x8', 'x3 x9', 'x3 x10', 'x3 x11', 'x3 x12', 'x4^2', 'x4 x5', 'x4 x6', 'x4 x7', 'x4 x8', 'x4 x9', 'x4 x10', 'x4 x11', 'x4 x12', 'x5^2', 'x5 x6', 'x5 x7', 'x5 x8', 'x5 x9', 'x5 x10', 'x5 x11', 'x5 x12', 'x6^2', 'x6 x7', 'x6 x8', 'x6 x9', 'x6 x10', 'x6 x11', 'x6 x12', 'x7^2', 'x7 x8', 'x7 x9', 'x7 x10', 'x7 x11', 'x7 x12', 'x8^2', 'x8 x9', 'x8 x10', 'x8 x11', 'x8 x12', 'x9^2', 'x9 x10', 'x9 x11', 'x9 x12', 'x10^2', 'x10 x11', 'x10 x12', 'x11^2', 'x11 x12', 'x12^2']\n"
     ]
    }
   ],
   "source": [
    "print(f\"多项式特征:{poly.get_feature_names()}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Score-without interaction:0.621\n",
      "Score-with interacftion:0.753\n"
     ]
    }
   ],
   "source": [
    "# 使用岭回归\n",
    "from sklearn.linear_model import Ridge\n",
    "ridge = Ridge().fit(X_train_scaled,y_train)\n",
    "print(\"Score-without interaction:{:.3f}\".format(ridge.score(X_test_scaled,y_test)))\n",
    "ridge = Ridge().fit(X_train_poly,y_train)\n",
    "print(\"Score-with interacftion:{:.3f}\".format(ridge.score(X_test_poly,y_test)))\n",
    "# 使用特征多项式后性能明显提升"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Score without interactions:0.807\n",
      "Score with interactions:0.769\n"
     ]
    }
   ],
   "source": [
    "# 使用更复杂的模型(随机森林)\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "rf = RandomForestRegressor(n_estimators=100).fit(X_train_scaled,y_train)\n",
    "print(\"Score without interactions:{:.3f}\".format(rf.score(X_test_scaled,y_test)))\n",
    "rf = RandomForestRegressor(n_estimators=100).fit(X_train_poly,y_train)\n",
    "print(\"Score with interactions:{:.3f}\".format(rf.score(X_test_poly,y_test)))\n",
    "# 可见即时没有添加多项式特征和交互式特征,实际上也会略微降低性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
